定期ミートアップ 第8回 yhara
BiwaSchemeがどうやってゲスト言語→ホスト言語→ゲスト言語を実現しているか
ホスト言語=JavaScript
ゲスト言語=Scheme
BiwaSchemeでは、コアライブラリはすべてJavaScriptで書く方針
例えば (sqrt 3)
ライブラリの中には、Scheme関数を呼び出すものがある
例えば (map (lambda (x) (+ x 1)) (list 1 2 3))
このとき、Scheme→JavaScript→Scheme (ゲスト言語→ホスト言語→ゲスト言語) という流れになる
これの実現方法は、処理系の作りによって異なる
コンパイラ方式の場合
例:SchemeプログラムをJavaScriptにコンパイルする処理系
lambdaを実行するようコンパイルするだけ
インタプリタ方式の場合
例:Schemeプログラムを逐次実行するJavaScriptで書いた処理系
その場でlambdaの実行に移るだけ
https://gyazo.com/ce025caf170b1329c0547f5ced9add50
VM方式の場合
BiwaSchemeはこれ
SchemeプログラムをVM命令列に変換する
そののち、VM命令列を逐次実行する
mapを見つけたら、JavaScriptで書かれたmap関数を実行する
ところが
map関数の中からSchemeクロージャを呼び出すにはどうすればいい?
Schemeのコードを動かすには、VMのメインループに戻らなければならない
mapは一つのクロージャをリストの各要素について繰り返し実行する=どこまで実行したかを覚えておかないといけない
BiwaSchemeの場合
ライブラリ関数からBiwaScheme.Callという特殊なオブジェクトを返すことで、VM側に「このクロージャを実行して」と依頼することができる
Callに「クロージャを実行したあとの処理」をjavascript functionとして入れておくと、VMがクロージャ実行後にそれを起動してくれる
https://gyazo.com/8891807c5bb6c85fe5c844d1ef1650e9